#include "stm32f10x.h"                  // Device header
//#include "stm32f10x_exti.h"
#include "sys.h"
#include "ec11.h"
int16_t Encoder_Count;//定义一个带符号的变量

int8_t AA=0;//定义一个带符号的变量

void Encoder_Init(void)
{
    //配置RCC
    
    GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
		EXTI_InitTypeDef EXTI_InitStructure;//定义外部中断结构体变量
		NVIC_InitTypeDef NVIC_InitStructure;//定义中断优先级结构体变量
	
	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    //配置GPIO
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//使用到PA6和PA7口
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //配置AFIO
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7); //AFIO每个中断是分开的
    //配置EXTI
    EXTI_InitStructure.EXTI_Line=EXTI_Line6;//使用到中断6
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断使能
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; //上升下降沿触发
    EXTI_Init(&EXTI_InitStructure);
    
    //配置NVIC，这里配置了个中断
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//调用一次即可，只能有一个，有多个必须保证相同

    NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//中断6的配置
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级为1
    NVIC_Init(&NVIC_InitStructure);//NVIC初始化
		




}

int16_t Return_Encoder_Count(void) //返回Encoder_Count的值，如果正转就返回+1，反转就返回-1。方便共主函数操作
{
    int16_t Temp;
    Temp = Encoder_Count;              
    Encoder_Count=0;
    return Temp;
    
}


unsigned char Encoder(void)//未成功
{
    static u8 Enc0=0,Enc1=0;
    static unsigned char EncOld,EncX=0;
    unsigned char EncNow;
    u8 EncType = 0; //设置编码器类型: 0为一定位一脉冲,1为两定位一脉冲
    if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;  //记住初次调用时编码器的状态
		EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);        //根据两个IO当前状态组合成16进制的0x00|0x01|0x02|0x03
		if(EncNow==EncOld)return(0);                                //如果新数据和原来的数据一样(没有转动)就直接返回0
    if((EncOld==0x00&&EncNow==0x02)||(EncOld==0x03&&EncNow==0x01))EncX=EncNow;         //00-10|11-01
    if((EncOld==0x00&&EncX==0x02&&EncNow==0x03)||(EncOld==0x03&&EncX==0x01&&EncNow==0x00))//00-10-11|11-01-00右转
    {
        EncOld = EncNow,EncX=0;
        if(EncType==1)return('R');   //两定位一脉冲
        else       //一定位一脉冲
        {
            if(Enc1==0)Enc1=1;
            else
            {
                delay_ms(60);    //延时降低旋转灵敏度(不能用在定时器中)
                Enc1=0;
                return('R');
            }
        }
    }
    if((EncOld==0x00&&EncNow==0x01)||(EncOld==0x03&&EncNow==0x02))EncX=EncNow;         //00-01|11-10
    if((EncOld==0x00&&EncX==0x01&&EncNow==0x03)||(EncOld==0x03&&EncX==0x02&&EncNow==0x00))//00-01-11|11-10-00左转
    {
        EncOld = EncNow,EncX=0;
        if(EncType==1)return('L');   //两定位一脉冲
        else           //一定位一脉冲
        {
            if(Enc1==0)Enc1=1;
            else
            {
                delay_ms(60);        //延时降低旋转灵敏度(不能用在定时器中)
                Enc1=0;
                return('L');
            }
        }
    }
    return(0);           //没有正确解码返回0
}



void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetFlagStatus(EXTI_Line6)==SET)
    {
        
				EXTI_ClearITPendingBit(EXTI_Line6);//清除中断标志位，以便下一次进入中断
				delay_us(1);
        if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)\
					||(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)) //如果正转
        {
           AA = 1;
					delay_us(200);
        }
        else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==0&&AA==1)  //如果正转
        {
          Encoder_Count++;  
					AA = 0;
        }				

//        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)  //如果正转
//        {
//           AA = 1;
//        }
				
        else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==0&&AA==1)  //如果正转
        {
          Encoder_Count--;  
					AA = 0;
        }	
				
    }

  
}






